extends Node2D
class_name 角色单位

@onready var 技能管理器: 技能管理器 = $技能管理器
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@onready var 投射物出发点: Marker2D = $投射物出发点
@onready var 角色属性: 角色属性 = $角色属性

@export var 队伍id:String
@export var 名称:String
#@export var 行动点数: int = 2
#var 当前行动点数: int



var 是否死亡: bool = false
signal 信号_死亡(unit: 角色单位)

var 是否鼠标悬浮在角色上:bool = false



var 技能动画名称:String
var 技能动画触发方法的帧序号:int = -1
var 技能动画触发方法:Callable
var 技能动画结束回调方法:Callable


var 当前网格坐标: Vector2i:
	get: return 网格管理器.获取网格坐标(global_position)
	
var 当前行动点数:int:
	get: return 角色属性.当前行动点数
	set(val):
		角色属性.修改行动点数(val) 	
	
var 移动路径: Array[Vector2]	

func _ready():
	游戏管理器.添加角色(self)
	回合管理器.信号_玩家回合开始.connect(当玩家回合开始时)
	回合管理器.信号_玩家回合开始.connect(当敌人回合开始时)

func 播放动画(name):
	animated_sprite_2d.play(name)	

func 播放技能动画(name, frame:int, 技能动画触发方法: Callable, 动画结束回调:Callable):
	self.技能动画名称 = name
	self.技能动画触发方法的帧序号 = frame
	self.技能动画触发方法 = 技能动画触发方法
	self.技能动画结束回调方法 = 动画结束回调
	
	animated_sprite_2d.play(name)	
	
	if 技能动画触发方法.is_valid() and frame!=-1:
		animated_sprite_2d.frame_changed.connect(on_frame_changed)
		
func on_frame_changed():
	var name = animated_sprite_2d.animation
	var frame = animated_sprite_2d.frame
	print("on_frame_changed: "+name+"," +str(frame))
	if name==self.技能动画名称 and frame==self.技能动画触发方法的帧序号:
		animated_sprite_2d.frame_changed.disconnect(on_frame_changed)
		self.技能动画触发方法.call()
		



func 面向目标(目标网格:Vector2i):
	var scale = animated_sprite_2d.scale
	if 当前网格坐标.x > 目标网格.x:
		animated_sprite_2d.scale = Vector2(-abs(scale.x),scale.y)
	if 当前网格坐标.x < 目标网格.x:
		animated_sprite_2d.scale = Vector2(abs(scale.x),scale.y)
	
func 移动(target_global_position: Vector2, delta:float):
	# 转向
	面向目标(网格管理器.获取网格坐标(target_global_position))
		
	global_position = global_position.move_toward(target_global_position, 角色属性.移动速度 * delta)	
	
	
func 受到伤害(val):
	print(名称+" 受到伤害 "+str(val))
	角色属性.降低生命值(val)
	播放动画("hurt")
	await animated_sprite_2d.animation_finished
	if 角色属性.当前生命值<=0:
		死亡()
	
	
func 死亡():
	print("角色:"+名称+" 死亡")
	是否死亡 = true
	
	信号_死亡.emit(self)
	animated_sprite_2d.play("die")
	await animated_sprite_2d.animation_finished
	await get_tree().create_timer(1).timeout
	queue_free()

func 当玩家回合开始时():
	if 队伍id == "玩家":
		角色属性.恢复行动点数()
	
func 当敌人回合开始时():
	if 队伍id != "玩家":
		角色属性.恢复行动点数()
		
	
	
# 点击选中角色		
func _unhandled_input(event):
	if 是否鼠标悬浮在角色上 and event.is_action_pressed("鼠标左键"):
		游戏管理器.选中角色(self)
		
func _on_mouse_entered():
	是否鼠标悬浮在角色上 = true

func _on_mouse_exited():
	是否鼠标悬浮在角色上 = false


# 动画播放结束后自动回到 idle动画
func _on_animation_finished() -> void:
	if 技能动画结束回调方法.is_valid():
		技能动画结束回调方法.call()
		技能动画结束回调方法 = Callable()
		
	if 	animated_sprite_2d.animation=="die":
		queue_free()
			
	if animated_sprite_2d.animation!="idle":
		animated_sprite_2d.play("idle")
		
	
